home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Unsupported Libraries / DemoRenderer / Renderer_Demo.c
Encoding:
C/C++ Source or Header  |  1999-05-18  |  24.0 KB  |  937 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **
  3.  **     Module:        Renderer_Demo.c
  4.  **
  5.  **     Purpose:     Demo plug-in renderer
  6.  **
  7.  **     Copyright (C) 1992-1996 Apple Computer, Inc.  All rights reserved.
  8.  **
  9.  *****************************************************************************/
  10.  
  11. #include "QD3D.h"
  12. #include "QD3DExtension.h"
  13. #include "QD3DRenderer.h"
  14. #include "QD3DStyle.h"
  15. #include <assert.h>
  16.  
  17. long DemoRenderer_Register(
  18.     void);
  19.  
  20. /*===========================================================================*\
  21.  *    Macros
  22. \*===========================================================================*/
  23. #define UNUSED(x)        (void) (x)
  24.  
  25. /*===========================================================================*\
  26.  *    Constants
  27. \*===========================================================================*/
  28. #define kRendererTypeDemo    Q3_OBJECT_TYPE('D','E','M','r')
  29. #define kRendererNameDemo    "DemoRenderer"
  30.  
  31. #define kDemoChangeFlag_SurfaceShader        (1 << 0)
  32. #define kDemoChangeFlag_IlluminationShader    (1 << 1)
  33. #define kDemoChangeFlag_Transformations        (1 << 2)
  34.  
  35. /*===========================================================================*\
  36.  *    Types
  37. \*===========================================================================*/
  38.  
  39. typedef struct TDemoRendererInfo {
  40.     unsigned long            changeFlags;
  41.     
  42.     TQ3Matrix4x4            localToWorld;
  43.     TQ3Matrix4x4            localToFrustum;
  44.     
  45.     TQ3Boolean                highlightState;
  46.     TQ3AttributeSet            highlightAttributeSet;
  47.     TQ3ColorRGB                diffuseColor;
  48.     TQ3ColorRGB                transparencyColor;
  49.     float                    specularControl;
  50.     TQ3ColorRGB                specularColor;
  51.     TQ3ShaderObject            surfaceShaderAttribute;
  52.     float                    ambientCoefficient;
  53.     
  54.     TQ3BackfacingStyle        backfacingStyle;
  55.     TQ3InterpolationStyle    interpolationStyle;
  56.     TQ3OrientationStyle        orientationStyle;
  57.     TQ3FillStyle            fillStyle;
  58.     
  59.     TQ3ShaderObject            surfaceShader;
  60.     TQ3ShaderObject            illuminationShader;
  61. } TDemoRendererInfo;
  62.  
  63. typedef struct TDemoRendererPrivate {
  64.     TDemoRendererInfo        renderInfo;
  65. } TDemoRendererPrivate;
  66.  
  67. /*===========================================================================*\
  68.  *    Globals
  69. \*===========================================================================*/
  70. static TQ3ObjectClass    gDemoRenderer;
  71.  
  72. /*===========================================================================*\
  73.  *
  74.  *    Object support
  75.  *
  76. \*===========================================================================*/
  77. /*===========================================================================*\
  78.  *    DemoRenderer_New
  79. \*===========================================================================*/
  80. static TQ3Status DemoRenderer_New(
  81.     TQ3Object                object,
  82.     TDemoRendererPrivate    *dPriv,        
  83.     void                    *parameters)
  84. {
  85.     UNUSED(object);
  86.     UNUSED(parameters);
  87.     
  88.     assert(dPriv != NULL);
  89.     
  90.     dPriv->renderInfo.changeFlags                = 0;
  91.     dPriv->renderInfo.highlightAttributeSet        = NULL;
  92.     dPriv->renderInfo.surfaceShaderAttribute    = NULL;
  93.     dPriv->renderInfo.surfaceShader                = NULL;
  94.     dPriv->renderInfo.illuminationShader        = NULL;
  95.  
  96.     return kQ3Success;
  97. }
  98.  
  99. /*===========================================================================*\
  100.  *    DemoRenderer_New
  101. \*===========================================================================*/
  102. static void DemoRenderer_Delete(
  103.     TQ3Object                object,
  104.     TDemoRendererPrivate    *dPriv)
  105. {
  106.     UNUSED(object);
  107.     
  108.     assert(dPriv != NULL);
  109.     
  110.     if (dPriv->renderInfo.highlightAttributeSet != NULL)
  111.     {
  112.         Q3Object_Dispose(dPriv->renderInfo.highlightAttributeSet);
  113.     }
  114.     if (dPriv->renderInfo.surfaceShaderAttribute != NULL)
  115.     {
  116.         Q3Object_Dispose(dPriv->renderInfo.surfaceShaderAttribute);
  117.     }
  118.     if (dPriv->renderInfo.surfaceShader != NULL)
  119.     {
  120.         Q3Object_Dispose(dPriv->renderInfo.surfaceShader);
  121.     }
  122.     if (dPriv->renderInfo.illuminationShader != NULL)
  123.     {
  124.         Q3Object_Dispose(dPriv->renderInfo.illuminationShader);
  125.     }
  126. }
  127.  
  128. /*===========================================================================*\
  129.  *    DemoRenderer_StartFrame
  130. \*===========================================================================*/
  131. static TQ3Status DemoRenderer_StartFrame(
  132.     TQ3ViewObject            view,
  133.     TDemoRendererPrivate    *rPriv,
  134.     TQ3DrawContextObject    drawContext)
  135. {
  136.     UNUSED(view);
  137.     UNUSED(rPriv);
  138.     UNUSED(drawContext);
  139.     
  140.     return kQ3Success;
  141. }
  142.  
  143. /*===========================================================================*\
  144.  *    DemoRenderer_StartFrame
  145. \*===========================================================================*/
  146. static TQ3Status DemoRenderer_StartScene(
  147.     TQ3ViewObject            view,
  148.     TDemoRendererPrivate    *rPriv,
  149.     TQ3CameraObject            camera,
  150.     TQ3GroupObject            lightGroup)
  151. {
  152.     UNUSED(view);
  153.     UNUSED(rPriv);
  154.     UNUSED(camera);
  155.     UNUSED(lightGroup);
  156.     
  157.     return kQ3Success;
  158. }
  159.  
  160. /*===========================================================================*\
  161.  *    DemoRenderer_Flush
  162. \*===========================================================================*/
  163. static TQ3Status DemoRenderer_FlushFrame(
  164.     TQ3ViewObject            view,
  165.     TDemoRendererPrivate    *rPriv,
  166.     TQ3DrawContextObject    drawContext)
  167. {
  168.     UNUSED(view);
  169.     UNUSED(rPriv);
  170.     UNUSED(drawContext);
  171.     
  172.     return kQ3Success;
  173. }
  174.     
  175. /*===========================================================================*\
  176.  *    DemoRenderer_EndScene
  177. \*===========================================================================*/
  178. static TQ3ViewStatus DemoRenderer_EndScene(
  179.     TQ3ViewObject            view,
  180.     TDemoRendererPrivate    *rPriv)
  181. {
  182.     UNUSED(view);
  183.     UNUSED(rPriv);
  184.     return kQ3ViewStatusDone;
  185. }
  186.  
  187. /*===========================================================================*\
  188.  *    DemoRenderer_Sync
  189. \*===========================================================================*/
  190. static TQ3Status DemoRenderer_EndFrame(
  191.     TQ3ViewObject            view,
  192.     void                    *rPriv,
  193.     TQ3DrawContextObject    drawContext)
  194. {
  195.     UNUSED(view);
  196.     UNUSED(rPriv);
  197.     UNUSED(drawContext);
  198.     
  199.     return kQ3Success;
  200. }
  201.  
  202. /*===========================================================================*\
  203.  *    DemoRenderer_Cancel
  204. \*===========================================================================*/
  205. static void DemoRenderer_Cancel(
  206.     TQ3ViewObject            view,
  207.     TDemoRendererPrivate    *rPriv)
  208. {
  209.     UNUSED(view);
  210.     UNUSED(rPriv);
  211. }
  212.  
  213. /*===========================================================================*\
  214.  *    DemoRenderer_Push
  215. \*===========================================================================*/
  216. static TQ3Status DemoRenderer_Push(
  217.     TQ3ViewObject            view,
  218.     void                    *rPriv)
  219. {
  220.     UNUSED(view);
  221.     UNUSED(rPriv);
  222.     return kQ3Success;
  223. }
  224.     
  225. /*===========================================================================*\
  226.  *    DemoRenderer_Pop
  227. \*===========================================================================*/
  228. static TQ3Status DemoRenderer_Pop(
  229.     TQ3ViewObject            view,
  230.     void                    *rPriv)
  231. {
  232.     UNUSED(view);
  233.     UNUSED(rPriv);
  234.     return kQ3Success;
  235. }
  236.  
  237. /*===========================================================================*\
  238.  *    DemoRenderer_IsBoundingBoxVisible
  239. \*===========================================================================*/
  240. static TQ3Boolean DemoRenderer_IsBoundingBoxVisible(
  241.     TQ3ViewObject            view,
  242.     void                    *rPriv,
  243.     const TQ3BoundingBox    *bBox)
  244. {
  245.     UNUSED(view);
  246.     UNUSED(rPriv);
  247.     UNUSED(bBox);
  248.     return kQ3True;
  249. }
  250.  
  251. /*===========================================================================*\
  252.  *
  253.  *    Routine    :    DemoRenderer_UpdateBackfacingStyle()
  254.  *
  255.  *    Comment    :    Retrieves the new state from the view
  256.  *
  257. \*===========================================================================*/
  258.  
  259. static TQ3Status DemoRenderer_UpdateBackfacingStyle(
  260.     TQ3ViewObject             view,
  261.     TDemoRendererPrivate    *rPriv,
  262.     TQ3BackfacingStyle        *data)
  263. {
  264.     UNUSED(view);
  265.     UNUSED(view);
  266.     UNUSED(view);
  267.     
  268.     assert(view != NULL);
  269.     assert(rPriv != NULL);
  270.     assert(data != NULL);
  271.  
  272.     rPriv->renderInfo.backfacingStyle = *data;
  273.  
  274.     return kQ3Success;
  275. }
  276.  
  277. /*===========================================================================*\
  278.  *
  279.  *    Routine    :    DemoRenderer_UpdateInterpolationStyle()
  280.  *
  281.  *    Comment    :    Retrieves the new state from the view
  282.  *
  283. \*===========================================================================*/
  284.  
  285. static TQ3Status DemoRenderer_UpdateInterpolationStyle(
  286.     TQ3ViewObject             view,
  287.     TDemoRendererPrivate        *rPriv,
  288.     TQ3InterpolationStyle    *data)
  289. {
  290.     UNUSED(view);
  291.     
  292.     assert(view != NULL);
  293.     assert(rPriv != NULL);
  294.     assert(data != NULL);
  295.  
  296.     rPriv->renderInfo.interpolationStyle = *data;
  297.  
  298.     return kQ3Success;
  299. }
  300.     
  301. /*===========================================================================*\
  302.  *
  303.  *    Routine    :    DemoRenderer_UpdateOrientationStyle()
  304.  *
  305.  *    Comment    :    Retrieves the new state from the view
  306.  *
  307. \*===========================================================================*/
  308.  
  309. static TQ3Status DemoRenderer_UpdateOrientationStyle(
  310.     TQ3ViewObject             view,
  311.     TDemoRendererPrivate        *rPriv,
  312.     TQ3OrientationStyle        *data)
  313. {
  314.     UNUSED(view);
  315.     
  316.     assert(view != NULL);
  317.     assert(rPriv != NULL);
  318.     assert(data != NULL);
  319.  
  320.     rPriv->renderInfo.orientationStyle = *data;
  321.  
  322.     return kQ3Success;
  323. }
  324.  
  325.  
  326. /*===========================================================================*\
  327.  *
  328.  *    Routine    :    DemoRenderer_UpdateFillStyle()
  329.  *
  330.  *    Comment    :    Retrieves the new state from the view
  331.  *
  332. \*===========================================================================*/
  333.  
  334. static TQ3Status DemoRenderer_UpdateFillStyle(
  335.     TQ3ViewObject             view,
  336.     TDemoRendererPrivate    *rPriv,
  337.     TQ3FillStyle            *data)
  338. {
  339.     UNUSED(view);
  340.     
  341.     assert(view != NULL);
  342.     assert(rPriv != NULL);
  343.     assert(data != NULL);
  344.  
  345.     rPriv->renderInfo.fillStyle = *data;
  346.  
  347.     return kQ3Success;
  348. }
  349.  
  350. /*===========================================================================*\
  351.  *
  352.  *    Routine:    DemoRenderer_StyleMetaHandler()
  353.  *
  354.  *    Comments:    
  355.  *
  356. \*===========================================================================*/
  357.  
  358. static TQ3FunctionPointer DemoRenderer_StyleMetaHandler(
  359.     TQ3MethodType            methodType)
  360. {
  361.     switch (methodType)
  362.     {
  363.         case kQ3StyleTypeBackfacing:
  364.             return (TQ3FunctionPointer) DemoRenderer_UpdateBackfacingStyle;
  365.         case kQ3StyleTypeInterpolation:
  366.             return (TQ3FunctionPointer) DemoRenderer_UpdateInterpolationStyle;
  367.         case kQ3StyleTypeOrientation:
  368.             return (TQ3FunctionPointer) DemoRenderer_UpdateOrientationStyle;
  369.         case kQ3StyleTypeFill:
  370.             return (TQ3FunctionPointer) DemoRenderer_UpdateFillStyle;
  371.         default:
  372.             return NULL;
  373.     }
  374. }
  375.  
  376. /*===========================================================================*\
  377.  *
  378.  *    Routine    :    DemoRenderer_UpdateHighlightStyle()
  379.  *
  380.  *    Comment    :    Retrieves the new state from the view
  381.  *
  382. \*===========================================================================*/
  383.  
  384. static TQ3Status DemoRenderer_UpdateHighlightStyle(
  385.     TQ3ViewObject             view,
  386.     TDemoRendererPrivate        *rPriv,
  387.     TQ3AttributeSet            *data)
  388. {
  389.     UNUSED(view);
  390.     
  391.     assert(view != NULL);
  392.     assert(rPriv != NULL);
  393.     assert(data != NULL);
  394.  
  395.     if (rPriv->renderInfo.highlightAttributeSet != NULL)
  396.     {
  397.         Q3Object_Dispose(rPriv->renderInfo.highlightAttributeSet);
  398.     }
  399.     if (*data != NULL)
  400.     {
  401.         Q3Shared_GetReference(*data);
  402.     }
  403.     
  404.     rPriv->renderInfo.highlightAttributeSet = *data;
  405.  
  406.     return kQ3Success;
  407. }
  408.  
  409. /*===========================================================================*\
  410.  *
  411.  *    Routine    :    DemoRenderer_UpdateDiffuseColor()
  412.  *
  413.  *    Comment    :    Retrieves the new state from the view
  414.  *
  415. \*===========================================================================*/
  416.  
  417. static TQ3Status DemoRenderer_UpdateDiffuseColor(
  418.     TQ3ViewObject             view,
  419.     TDemoRendererPrivate    *rPriv,
  420.     TQ3ColorRGB                *data)
  421. {
  422.     UNUSED(view);
  423.     
  424.     assert(view != NULL);
  425.     assert(rPriv != NULL);
  426.     assert(data != NULL);
  427.  
  428.     rPriv->renderInfo.diffuseColor = *data;
  429.  
  430.     return kQ3Success;
  431. }
  432.  
  433. /*===========================================================================*\
  434.  *
  435.  *    Routine    :    DemoRenderer_UpdateAmbientCoefficient()
  436.  *
  437.  *    Comment    :    Retrieves the new state from the view
  438.  *
  439. \*===========================================================================*/
  440.  
  441. static TQ3Status DemoRenderer_UpdateAmbientCoefficient(
  442.     TQ3ViewObject             view,
  443.     TDemoRendererPrivate    *rPriv,
  444.     float                    *data)
  445. {
  446.     UNUSED(view);
  447.     
  448.     assert(view != NULL);
  449.     assert(rPriv != NULL);
  450.     assert(data != NULL);
  451.  
  452.     rPriv->renderInfo.ambientCoefficient = *data;
  453.  
  454.     return kQ3Success;
  455. }
  456.  
  457. /*===========================================================================*\
  458.  *
  459.  *    Routine    :    DemoRenderer_UpdateSpecularColor()
  460.  *
  461.  *    Comment    :    Retrieves the new state from the view
  462.  *
  463. \*===========================================================================*/
  464.  
  465. static TQ3Status DemoRenderer_UpdateSpecularColor(
  466.     TQ3ViewObject             view,
  467.     TDemoRendererPrivate    *rPriv,
  468.     TQ3ColorRGB                *data)
  469. {
  470.     UNUSED(view);
  471.     
  472.     assert(view != NULL);
  473.     assert(rPriv != NULL);
  474.     assert(data != NULL);
  475.  
  476.     rPriv->renderInfo.specularColor = *data;
  477.  
  478.     return kQ3Success;
  479. }
  480.  
  481. /*===========================================================================*\
  482.  *
  483.  *    Routine    :    DemoRenderer_UpdateSpecularControl()
  484.  *
  485.  *    Comment    :    Retrieves the new state from the view
  486.  *
  487. \*===========================================================================*/
  488.  
  489. static TQ3Status DemoRenderer_UpdateSpecularControl(
  490.     TQ3ViewObject             view,
  491.     TDemoRendererPrivate        *rPriv,
  492.     float                    *data)
  493. {
  494.     UNUSED(view);
  495.     
  496.     assert(view != NULL);
  497.     assert(rPriv != NULL);
  498.     assert(data != NULL);
  499.  
  500.     rPriv->renderInfo.specularControl = *data;
  501.  
  502.     return kQ3Success;
  503. }
  504.  
  505. /*===========================================================================*\
  506.  *
  507.  *    Routine    :    DemoRenderer_UpdateTransparencyColor()
  508.  *
  509.  *    Comment    :    Retrieves the new state from the view
  510.  *
  511. \*===========================================================================*/
  512.  
  513. static TQ3Status DemoRenderer_UpdateTransparencyColor(
  514.     TQ3ViewObject             view,
  515.     TDemoRendererPrivate    *rPriv,
  516.     TQ3ColorRGB                *data)
  517. {
  518.     UNUSED(view);
  519.     
  520.     assert(view != NULL);
  521.     assert(rPriv != NULL);
  522.     assert(data != NULL);
  523.  
  524.     rPriv->renderInfo.transparencyColor = *data;
  525.  
  526.     return kQ3Success;
  527. }
  528.  
  529. /*===========================================================================*\
  530.  *
  531.  *    Routine    :    DemoRenderer_UpdateAmbientCoefficient()
  532.  *
  533.  *    Comment    :    Retrieves the new state from the view
  534.  *
  535. \*===========================================================================*/
  536.  
  537. static TQ3Status DemoRenderer_UpdateHighlightState(
  538.     TQ3ViewObject             view,
  539.     TDemoRendererPrivate    *rPriv,
  540.     TQ3Boolean                *highlightState)
  541. {
  542.     UNUSED(view);
  543.     
  544.     assert(view != NULL);
  545.     assert(rPriv != NULL);
  546.     assert(highlightState != NULL);
  547.  
  548.     rPriv->renderInfo.highlightState = *highlightState;
  549.  
  550.     return kQ3Success;
  551. }
  552.  
  553. /*===========================================================================*\
  554.  *
  555.  *    Routine    :    DemoRenderer_UpdateAmbientCoefficient()
  556.  *
  557.  *    Comment    :    Retrieves the new state from the view
  558.  *
  559. \*===========================================================================*/
  560.  
  561. static TQ3Status DemoRenderer_UpdateAttributeSurfaceShader(
  562.     TQ3ViewObject             view,
  563.     TDemoRendererPrivate        *rPriv,
  564.     TQ3ShaderObject            *data)
  565. {
  566.     UNUSED(view);
  567.     
  568.     assert(view != NULL);
  569.     assert(rPriv != NULL);
  570.     assert(data != NULL);
  571.  
  572.     if (*data != NULL)
  573.     {
  574.         Q3Shared_GetReference(*data);
  575.     }
  576.     if (rPriv->renderInfo.surfaceShaderAttribute != NULL)
  577.     {
  578.         Q3Object_Dispose(rPriv->renderInfo.surfaceShaderAttribute);
  579.     }
  580.     rPriv->renderInfo.surfaceShaderAttribute = *data;
  581.     
  582.     rPriv->renderInfo.changeFlags |= kDemoChangeFlag_SurfaceShader;
  583.  
  584.     return kQ3Success;
  585. }
  586.  
  587. /*===========================================================================*\
  588.  *
  589.  *    Routine:    DemoRenderer_AttributeMetaHandler()
  590.  *
  591.  *    Comments:    
  592.  *
  593. \*===========================================================================*/
  594.  
  595. static TQ3FunctionPointer DemoRenderer_AttributeMetaHandler(
  596.     TQ3MethodType            methodType)
  597. {
  598.     switch (methodType)
  599.     {
  600.         case kQ3AttributeTypeDiffuseColor:
  601.             return (TQ3FunctionPointer) DemoRenderer_UpdateDiffuseColor;
  602.         case kQ3AttributeTypeAmbientCoefficient:
  603.             return (TQ3FunctionPointer) DemoRenderer_UpdateAmbientCoefficient;
  604.         case kQ3AttributeTypeSpecularColor:
  605.             return (TQ3FunctionPointer) DemoRenderer_UpdateSpecularColor;
  606.         case kQ3AttributeTypeSpecularControl:
  607.             return (TQ3FunctionPointer) DemoRenderer_UpdateSpecularControl;
  608.         case kQ3AttributeTypeHighlightState:
  609.             return (TQ3FunctionPointer) DemoRenderer_UpdateHighlightState;
  610.         case kQ3AttributeTypeSurfaceShader:
  611.             return (TQ3FunctionPointer) DemoRenderer_UpdateAttributeSurfaceShader;
  612.         case kQ3AttributeTypeTransparencyColor:
  613.             return (TQ3FunctionPointer) DemoRenderer_UpdateTransparencyColor;
  614.         default:
  615.             return NULL;
  616.     }
  617. }
  618.  
  619. /*===========================================================================*\
  620.  *
  621.  *    Routine    :    DemoRenderer_UpdateLocalToWorld()
  622.  *
  623.  *    Comment    :    
  624.  *
  625. \*===========================================================================*/
  626.  
  627. static TQ3Status DemoRenderer_UpdateLocalToWorldMatrix(
  628.     TQ3ViewObject         view,
  629.     TDemoRendererPrivate    *rPriv,
  630.     TQ3Matrix4x4        *data)
  631. {
  632.     UNUSED(view);
  633.     
  634.     assert(view != NULL);
  635.     assert(rPriv != NULL);
  636.     assert(data != NULL);
  637.  
  638.     rPriv->renderInfo.localToWorld = *data;
  639.     
  640.     rPriv->renderInfo.changeFlags |= kDemoChangeFlag_Transformations;
  641.     
  642.     return kQ3Success;
  643. }
  644.  
  645. /*===========================================================================*\
  646.  *
  647.  *    Routine    :    DemoRenderer_UpdateTransformations()
  648.  *
  649.  *    Comment    :    
  650.  *
  651. \*===========================================================================*/
  652.  
  653. static TQ3Status DemoRenderer_UpdateLocalToFrustumMatrix(
  654.     TQ3ViewObject         view,
  655.     TDemoRendererPrivate    *rPriv,
  656.     TQ3Matrix4x4        *data)
  657. {
  658.     UNUSED(view);
  659.     
  660.     assert(view != NULL);
  661.     assert(rPriv != NULL);
  662.     assert(data != NULL);
  663.  
  664.     rPriv->renderInfo.localToFrustum = *data;
  665.     
  666.     rPriv->renderInfo.changeFlags |= kDemoChangeFlag_Transformations;
  667.  
  668.     return kQ3Success;
  669. }
  670.  
  671. /*===========================================================================*\
  672.  *
  673.  *    Routine:    DemoRenderer_MatrixMetaHandler()
  674.  *
  675.  *    Comments:    
  676.  *
  677. \*===========================================================================*/
  678.  
  679. static TQ3FunctionPointer DemoRenderer_MatrixMetaHandler(
  680.     TQ3MethodType            methodType)
  681. {
  682.     switch (methodType)
  683.     {
  684.         case kQ3MethodTypeRendererUpdateMatrixLocalToWorld:
  685.             return (TQ3FunctionPointer) DemoRenderer_UpdateLocalToWorldMatrix;
  686.         case kQ3MethodTypeRendererUpdateMatrixLocalToFrustum:
  687.             return (TQ3FunctionPointer) DemoRenderer_UpdateLocalToFrustumMatrix;
  688.         default:
  689.             return NULL;
  690.     }
  691. }
  692.  
  693.  
  694. /*===========================================================================*\
  695.  *
  696.  *    Shader Support
  697.  *
  698. \*===========================================================================*/
  699.  
  700. /*===========================================================================*\
  701.  *
  702.  *    Routine    :    DemoRenderer_UpdateSurfaceShader()
  703.  *
  704.  *    Comment    :    
  705.  *
  706. \*===========================================================================*/
  707.  
  708. static TQ3Status DemoRenderer_UpdateSurfaceShader(
  709.     TQ3ViewObject             view,
  710.     TDemoRendererPrivate    *rPriv,
  711.     TQ3ShaderObject            *data)
  712. {
  713.     UNUSED(view);
  714.     
  715.     assert(view != NULL);
  716.     assert(rPriv != NULL);
  717.     assert(data != NULL);
  718.     
  719.     if (*data != NULL)
  720.     {
  721.         Q3Shared_GetReference(*data);
  722.     }
  723.     if (rPriv->renderInfo.surfaceShader != NULL)
  724.     {
  725.         Q3Object_Dispose(rPriv->renderInfo.surfaceShader);
  726.     }
  727.     rPriv->renderInfo.surfaceShader = *data;
  728.     
  729.     rPriv->renderInfo.changeFlags |= kDemoChangeFlag_SurfaceShader;
  730.     
  731.     return kQ3Success;
  732. }
  733.     
  734. /*===========================================================================*\
  735.  *
  736.  *    Routine    :    DemoRenderer_UpdateIlluminationShader()
  737.  *
  738.  *    Comment    :    
  739.  *
  740. \*===========================================================================*/
  741.  
  742. static TQ3Status DemoRenderer_UpdateIlluminationShader(
  743.     TQ3ViewObject             view,
  744.     TDemoRendererPrivate    *rPriv,
  745.     TQ3ShaderObject            *data)
  746. {
  747.     UNUSED(view);
  748.     
  749.     assert(view != NULL);
  750.     assert(rPriv != NULL);
  751.     assert(data != NULL);
  752.     
  753.     if (*data != NULL)
  754.     {
  755.         Q3Shared_GetReference(*data);
  756.     }
  757.     if (rPriv->renderInfo.illuminationShader != NULL)
  758.     {
  759.         Q3Object_Dispose(rPriv->renderInfo.illuminationShader);
  760.     }
  761.     rPriv->renderInfo.illuminationShader = *data;
  762.     
  763.     rPriv->renderInfo.changeFlags |= kDemoChangeFlag_IlluminationShader;
  764.     
  765.     return kQ3Success;
  766. }
  767.  
  768. /*===========================================================================*\
  769.  *
  770.  *    Routine:    DemoRenderer_ShaderMetaHandler()
  771.  *
  772.  *    Comments:    
  773.  *
  774. \*===========================================================================*/
  775.  
  776. static TQ3FunctionPointer DemoRenderer_ShaderMetaHandler(
  777.     TQ3MethodType            methodType)
  778. {
  779.     switch (methodType)
  780.     {
  781.         case kQ3ShaderTypeIllumination:
  782.             return (TQ3FunctionPointer) DemoRenderer_UpdateIlluminationShader;
  783.         case kQ3ShaderTypeSurface:
  784.             return (TQ3FunctionPointer) DemoRenderer_UpdateSurfaceShader;
  785.         default:
  786.             return NULL;
  787.     }
  788. }
  789.  
  790.  
  791. /*===========================================================================*\
  792.  *
  793.  *    Geometry Support
  794.  *
  795. \*===========================================================================*/
  796. static TQ3Status DemoRenderer_GeometrySubmit_Triangle(
  797.     TQ3ViewObject                    view,
  798.     TDemoRendererPrivate            *rPriv,
  799.     TQ3GeometryObject                geometry,
  800.     void                            *publicData)
  801. {
  802.     UNUSED(view);
  803.     UNUSED(rPriv);
  804.     UNUSED(geometry);
  805.     UNUSED(publicData);
  806.     return kQ3Success;
  807. }
  808.  
  809. static TQ3Status DemoRenderer_GeometrySubmit_PixmapMarker(
  810.     TQ3ViewObject                    view,
  811.     TDemoRendererPrivate            *rPriv,
  812.     TQ3GeometryObject                geometry,
  813.     void                            *publicData)
  814. {
  815.     UNUSED(view);
  816.     UNUSED(rPriv);
  817.     UNUSED(geometry);
  818.     UNUSED(publicData);
  819.     return kQ3Success;
  820. }
  821.  
  822.  
  823. static TQ3Status DemoRenderer_GeometrySubmit_Line(
  824.     TQ3ViewObject                    view,
  825.     TDemoRendererPrivate            *rPriv,
  826.     TQ3GeometryObject                geometry,
  827.     void                            *publicData)
  828. {
  829.     UNUSED(view);
  830.     UNUSED(rPriv);
  831.     UNUSED(geometry);
  832.     UNUSED(publicData);
  833.     return kQ3Success;
  834. }
  835.  
  836.  
  837. static TQ3Status DemoRenderer_GeometrySubmit_Point(
  838.     TQ3ViewObject                    view,
  839.     TDemoRendererPrivate            *rPriv,
  840.     TQ3GeometryObject                geometry,
  841.     void                            *publicData)
  842. {
  843.     UNUSED(view);
  844.     UNUSED(rPriv);
  845.     UNUSED(geometry);
  846.     UNUSED(publicData);
  847.     return kQ3Success;
  848. }
  849.  
  850.  
  851. /*===========================================================================*\
  852.  *    DemoRenderer_GeometryMetaHandler
  853. \*===========================================================================*/
  854. static TQ3FunctionPointer DemoRenderer_GeometryMetaHandler(
  855.     TQ3ObjectType                methodType)
  856. {
  857.     switch (methodType) {
  858.         case kQ3GeometryTypeTriangle:
  859.             return (TQ3FunctionPointer) DemoRenderer_GeometrySubmit_Triangle;
  860.         case kQ3GeometryTypePixmapMarker:
  861.             return (TQ3FunctionPointer) DemoRenderer_GeometrySubmit_PixmapMarker;
  862.         case kQ3GeometryTypeLine:
  863.             return (TQ3FunctionPointer) DemoRenderer_GeometrySubmit_Line;
  864.         case kQ3GeometryTypePoint:
  865.             return (TQ3FunctionPointer) DemoRenderer_GeometrySubmit_Point;
  866.         default:
  867.             return NULL;
  868.     }
  869. }
  870.  
  871. /*===========================================================================*\
  872.  *
  873.  *    Routine:    DemoRenderer_MethodsMetaHandler()
  874.  *
  875.  *    Comments:    
  876.  *
  877. \*===========================================================================*/
  878. static TQ3FunctionPointer DemoRenderer_MetaHandler(
  879.     TQ3MethodType        pMethodType)
  880. {
  881.  
  882.     switch (pMethodType)
  883.     {
  884.         case kQ3MethodTypeObjectNew:
  885.             return (TQ3FunctionPointer) DemoRenderer_New;
  886.         case kQ3MethodTypeObjectDelete:
  887.             return (TQ3FunctionPointer) DemoRenderer_Delete;
  888.         case kQ3MethodTypeRendererStartFrame:
  889.             return (TQ3FunctionPointer) DemoRenderer_StartFrame;
  890.         case kQ3MethodTypeRendererStartScene:
  891.             return (TQ3FunctionPointer) DemoRenderer_StartScene;
  892.         case kQ3MethodTypeRendererCancel:
  893.             return (TQ3FunctionPointer) DemoRenderer_Cancel;
  894.         case kQ3MethodTypeRendererEndScene:
  895.             return (TQ3FunctionPointer) DemoRenderer_EndScene;
  896.         case kQ3MethodTypeRendererEndFrame:
  897.             return (TQ3FunctionPointer) DemoRenderer_EndFrame;
  898.         case kQ3MethodTypeRendererClassSupportFlag:
  899.             return (TQ3FunctionPointer)
  900.                 (    kQ3RendererClassSupportFlagDoubleBuffer |
  901.                     kQ3RendererClassSupportFlagClearBuffer    );
  902.         case kQ3MethodTypeRendererIsBoundingBoxVisible:
  903.             return (TQ3FunctionPointer) DemoRenderer_IsBoundingBoxVisible;
  904.  
  905.         case kQ3MethodTypeRendererSubmitGeometryMetaHandler:
  906.             return (TQ3FunctionPointer) DemoRenderer_GeometryMetaHandler;
  907.         case kQ3MethodTypeRendererUpdateStyleMetaHandler:
  908.             return (TQ3FunctionPointer) DemoRenderer_StyleMetaHandler;
  909.         case kQ3MethodTypeRendererUpdateAttributeMetaHandler:
  910.             return (TQ3FunctionPointer) DemoRenderer_AttributeMetaHandler;
  911.         case kQ3MethodTypeRendererUpdateShaderMetaHandler:
  912.             return (TQ3FunctionPointer) DemoRenderer_ShaderMetaHandler;
  913.         case kQ3MethodTypeRendererUpdateMatrixMetaHandler:
  914.             return (TQ3FunctionPointer) DemoRenderer_MatrixMetaHandler;
  915.         default:
  916.             return NULL;
  917.     }
  918. }
  919.  
  920. /*===========================================================================*\
  921.  *
  922.  *    DemoRenderer_Register
  923.  *
  924. \*===========================================================================*/
  925. long DemoRenderer_Register(
  926.     void)
  927. {
  928.     gDemoRenderer = 
  929.         Q3RendererClass_Register(
  930.             kRendererTypeDemo,
  931.             kRendererNameDemo,
  932.             DemoRenderer_MetaHandler,
  933.             0,
  934.             sizeof(TDemoRendererPrivate));
  935.     
  936.     return 0;
  937. }